package com.train.common.enums;

import com.google.common.net.MediaType;
import lombok.Getter;

/**
 * @author daiwei
 */
public enum FileTypeEnum {
    /**
     * 文档
     */
    WORD(".doc"),

    /**
     * PPT文档
     */
    PPT(".ppt"),

    /**
     * 制表文档
     */
    EXCEL(".xls"),

    /**
     * PDF文档
     */
    PDF(".pdf"),

    /**
     * 图片
     */
    IMAGE(".jpg"),
    PNG(".png"),

    /**
     * 视频
     */
    VIDEO(".mp4"),

    /**
     * 音频
     */
    AUDIO(".mp3"),

    FLASH(".swf");

    /**
     * 默认扩展名
     */
    @Getter
    String defaultExtension;

    FileTypeEnum(String defaultExtension) {
        this.defaultExtension = defaultExtension;
    }

    /**
     * 根据contentType获取对应的文件类型
     *
     * @param contentType 文件媒体类型
     * @return FileType
     */
    public static FileTypeEnum parseContentType(String contentType) {
        MediaType mediaType = MediaType.parse(contentType);
        if (mediaType.is(MediaType.OOXML_DOCUMENT) || mediaType.is(MediaType.MICROSOFT_WORD)) {
            return WORD;
        }
        if (mediaType.is(MediaType.OOXML_PRESENTATION) || mediaType.is(MediaType.MICROSOFT_POWERPOINT)) {
            return PPT;
        }
        if (mediaType.is(MediaType.OOXML_SHEET) || mediaType.is(MediaType.MICROSOFT_EXCEL)) {
            return EXCEL;
        }
        if (mediaType.is(MediaType.PDF)) {
            return PDF;
        }
        if (mediaType.is(MediaType.ANY_IMAGE_TYPE)) {
            return IMAGE;
        }
        if (mediaType.is(MediaType.ANY_VIDEO_TYPE)) {
            return VIDEO;
        }
        if (mediaType.is(MediaType.ANY_AUDIO_TYPE)) {
            return AUDIO;
        }
        if (MediaType.SHOCKWAVE_FLASH.equals(mediaType)) {
            return FLASH;
        }
        return null;
    }

    /**
     * 根据文件的后缀名获取mimeType
     *
     * @param filename 文件名称
     * @return mime_type
     */
    public static String getMimeTypeByExtension(String filename) {
        int pos = filename.lastIndexOf('.');
        if (pos == -1) {
            return null;
        }
        String extension = filename.substring(pos + 1);
        if ("doc".equalsIgnoreCase(extension)) {
            return MediaType.MICROSOFT_WORD.toString();
        } else if ("docx".equalsIgnoreCase(extension)) {
            return MediaType.OOXML_DOCUMENT.toString();
        } else if ("ppt".equalsIgnoreCase(extension)) {
            return MediaType.MICROSOFT_POWERPOINT.toString();
        } else if ("pptx".equalsIgnoreCase(extension)) {
            return MediaType.OOXML_PRESENTATION.toString();
        } else if ("xls".equalsIgnoreCase(extension)) {
            return MediaType.MICROSOFT_EXCEL.toString();
        } else if ("xlsx".equalsIgnoreCase(extension)) {
            return MediaType.OOXML_SHEET.toString();
        } else if ("pdf".equalsIgnoreCase(extension)) {
            return MediaType.PDF.toString();
        } else if ("mp4".equalsIgnoreCase(extension)) {
            return MediaType.MP4_VIDEO.toString();
        } else if ("swf".equalsIgnoreCase(extension)) {
            return MediaType.SHOCKWAVE_FLASH.toString();
        } else if ("jpg".equalsIgnoreCase(extension) || "jpeg".equalsIgnoreCase(extension)) {
            return MediaType.JPEG.toString();
        } else if ("mp3".equalsIgnoreCase(extension)) {
            return "audio/mp3";
        } else if ("png".equalsIgnoreCase(extension)) {
            return MediaType.PNG.toString();
        } else {
            return null;
        }

    }

    /**
     * 判断文件是否是doc或docx文档
     *
     * @param contentType
     * @return
     */
    public static boolean isWordDoc(String contentType) {
        MediaType mediaType = MediaType.parse(contentType);
        return mediaType.is(MediaType.OOXML_DOCUMENT) || mediaType.is(MediaType.MICROSOFT_WORD);
    }

    /**
     * 判断文件是否是doc文档
     *
     * @param contentType
     * @return
     */
    public static boolean is03WordDoc(String contentType) {
        MediaType mediaType = MediaType.parse(contentType);
        return mediaType.is(MediaType.MICROSOFT_WORD);
    }

    /**
     * 是否是Office文档
     *
     * @return
     */
    public boolean isOffice() {
        return this.equals(WORD) || this.equals(EXCEL) || this.equals(PPT);
    }
}
